package com.java.grammer.innerclass.test1;

/**
 * @author luzhikun
 * @date 2020/12/17-17:49
 * <p>
 * 类的成员之五： 内部类
 * 1.java中允许将一个类A声明在另外一个类B中， 其中类A叫做内部类 类B叫做外部类
 * <p>
 * 2.内部类的分类：  成员内部类(静态/非静态)  vs  局部内部类（方法内，代码块内，构造方法内）
 * <p>
 * <p>
 * 3。成员内部类：
 * 一方面，作为外部类的成员:
 * 可以被static修饰
 * 可以调用外部类的结构
 * 可以被四种权限修饰符修饰
 * <p>
 * 另一方面，作为一个类  ：
 * 类内可以定义属性、方法、构造器等
 * 可以被finall修饰，不能被继承 没有被finall修饰时，就可以被继承
 * <p>
 * 4.关注以下三个问题
 * 4.1如何实例化成员内部类的对象
 * 4.2 如何在成员内部类中区分调用外部类的结构
 * 4.3 开发中局部内部类的使用
 */
public class InnerClassTest {
    public static void main(String[] args) {
        Test.Daulanth du = new Test.Daulanth();
        du.name = "吴杰";
        String a = du.toString();
        System.out.println(a);
//        Test.Son d1=new Test.Son();
        Test test = new Test();
        Test.Son son1 = test.new Son();
        son1.main("张恒");
    }
}

class Test {
    String name = "李鹏";
    int age;

    //非静态成员内部类
    class Son {
        String name = "吴杰";

        public void main(String name) {
//             name="张恒";
            System.out.println(name);
            System.out.println(this.name);
            System.out.println(Test.this.name);
            sleep();
        }
    }

    public void sleep() {

    }

    //静态内部类
    static final class Daulanth {
        String name;

        public String toString(String name) {
//            System.out.println("我是一只小鸟");
            return "我是一只小鸟" + name;

//            sleep;
        }

    }

    //局部内部类
    public Test() {              //构造器内
        class Hero extends Son {

        }
    }

    {
//        class Women extends Daulanth{            //构造器内

//        }
    }

    public void eat() {          //方法内
        class Man {

        }
    }
}